Первое что я сделаю, это немного исправлю функцию в классе навигаторе. Смысл такой, когда в навигатор передается набор записей, он проверяет, есть ли записи вообще. Если нет, то одну он создаст. Обновленный класс навигатора будет в проекте.
void CDaoNavigator::SetRecordset(CDaoRecordset *cRecord)
{
m_pRecord=cRecord;
if (m_pRecord->IsBOF() & m_pRecord->IsEOF())
{
m_pRecord->AddNew(); // новая
m_pRecord->Update(); // подтвердить
m_pRecord->MoveLast(); // на последнею
}
}
Для того, что бы не добавлять постоянно на диалог кнопки вперед назад лучше создать шаблон диалога. Как это сделать читайте "Шаг 359 - Свои шаблоны для диалога".
Пора создавать класс. Имя у него будет CDaoDialog. В примере объявления я оставлю самое главное.
#include "afxdao.h"
#include "DaoNavigator.h"
class CDaoDialog : public CDialog
{
// Construction
public:
void Last();
void First();
void Prev();
void Next();
void SaveData();
void SetRecorset(CDaoRecordset* m_pSet);
CDaoDialog(int IDD,CWnd* pParent = NULL); // standard constructor
......
private:
CDaoRecordset* m_pRecordset;
CDaoNavigator cNavigator;
};
Обратите внимание, что у него уже есть свой класс навигатора. От объявлен в классе диалога. Для того, что бы объяснить навигатору, с чем мы имеем дело есть функция SetRecorset, которая передает набор записей навигатору и запоминает у себя.
void CDaoDialog::SetRecorset(CDaoRecordset *m_pSet)
{
m_pRecordset=m_pSet;
cNavigator.SetRecordset(m_pSet);
}
Вот функции навигации и сохранение. Больше их не надо будет кодировать в диалогах.
void CDaoDialog::SaveData()
{
if (!(m_pRecordset->IsEOF()))
{
m_pRecordset->Edit();
UpdateData(TRUE);
m_pRecordset->Update();
}
}
void CDaoDialog::Next()
{
SaveData();
cNavigator.OnButtonNext();
UpdateData(FALSE);
}
void CDaoDialog::Prev()
{
SaveData();
cNavigator.OnButtonPrev();
UpdateData(FALSE);
}
void CDaoDialog::First()
{
SaveData();
cNavigator.OnButtonFirst();
UpdateData(FALSE);
}
void CDaoDialog::Last()
{
SaveData();
cNavigator.OnButtonLast();
UpdateData(FALSE);
}
Изменен конструктор. Мы же не знаем, с каким диалогом будет работать этот класс. Вот и сделаем, что в конструкторе можно передать идентификатор диалога.
CDaoDialog::CDaoDialog(int IDD,CWnd* pParent /*=NULL*/)
: CDialog(IDD, pParent)
{
//{{AFX_DATA_INIT(CDaoDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
Ну вот и все. Мы опять сняли часть работы по поводу создания диалогов и кодирования. В проекте находится класс CDaoNavigator и CDaoDialog упакованный для использования в Component Gallery как ogx файл.